package com.tosee.logic.controle;

import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;

import com.tosee.exception.GeneriqueException;
import com.tosee.exception.MetierException;
import com.tosee.model.dbTosee.User;
import com.tosee.model.dto.AbstractDto;
import com.tosee.utils.Utils;

/**
 * Controles communs de l'application
 * 
 * @author robint
 */
@Service
public final class CommunControle extends AbstractControle {

    /**
     * Methode d'authentification et de validation de l'accès au service
     * 
     * @param _abstractDto Le paramMethode
     * @throws GeneriqueException Exception generique
     */
    public void authentifier(final AbstractDto _abstractDto) throws GeneriqueException {

        // Chargement des données liées à l'authentification si ce n'est pas déjà fait
        if(_abstractDto != null && _abstractDto.getAuthentification() != null
                && !_abstractDto.getAuthentification().isPreAuthentificationFaite()) {
            // Permet de ne pas recharger les données inutilement
            _abstractDto.getAuthentification().setPreAuthentificationFaite(true);

            // Chargement des droits (si login et mdp renseignés)
            if(StringUtils.isNotBlank(_abstractDto.getAuthentification().getLogin())
                    && StringUtils.isNotBlank(_abstractDto.getAuthentification().getMdp())) {

                User user = getDaoProvider().getUserDao().getUserByLogin(_abstractDto.getAuthentification().getLogin());
                if(user != null && StringUtils.isNotBlank(user.getMdp()) && StringUtils.isNotBlank(user.getGrainSel())) {
                    if(Utils.validerMdp(_abstractDto.getAuthentification().getMdp(), user.getMdp(), user.getGrainSel())) {
                        _abstractDto.getAuthentification().setId(user.getId());
                        _abstractDto.getAuthentification().setEmail(user.getEmail());
                        _abstractDto.getAuthentification().setActionAutorisee(true);

                        // TODO VOIR SI EVOLUER
                        /*
                         * retour.setGds(user.getGrainSel()); retour.setDateCreation(user.getDateCreation()); retour.setDateLastAction(user.getDateLastAction());
                         */
                    }
                }
            }
        }

        if(_abstractDto == null || _abstractDto.getAuthentification() == null
                || _abstractDto.getAuthentification().getId() == null
                || _abstractDto.getAuthentification().getId() <= 0
                || !_abstractDto.getAuthentification().isActionAutorisee()) {
            throw new MetierException(_abstractDto != null ? _abstractDto.getLocaleUser() : null,
                    "erreur.metier.global.rgg001");
        }
    }

}
